package com.example.demo.task;

import cn.hutool.core.thread.ThreadUtil;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * xxl-job的方法定时任务demo，详见：https://www.xuxueli.com/xxl-job/
 *
 * 5.12 执行器灰度上线
 *
 * @author TongDaShuai
 * @since 2021/11/18
 */
@Component
public class XxlJobDemo {


    /**
     * 简单bean任务
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() {

        XxlJobHelper.log("xxljob的demoJobHandler开始了。。。。。。。。。。。。。。。。。");
        // 任务终止时通过 “interrupt” 执行线程的方式实现, 将会触发 “InterruptedException” 异常。因此如果JobHandler内
        // 部catch到了该异常并消化掉的话, 任务终止功能将不可用。
//        int i = 0;
//        while (i < 100000000) {
//            i++;
//            XxlJobHelper.log("xxljob的demoJobHandler进行中。。。。。。。。。。。。。。。。。");
//        }
        XxlJobHelper.log("xxljob的demoJobHandler结束了。。。。。。。。。。。。。。。。。");


    }

    /**
     * 分片广播任务
     *
     * 该特性适用场景如：
     *
     * 1、分片任务场景：10个执行器的集群来处理10w条数据，每台机器只需要处理1w条数据，耗时降低10倍；
     * 2、广播任务场景：广播执行器机器运行shell脚本、广播集群节点进行缓存更新等
     */
    @XxlJob("demoShardJobHandler")
    public void demoShardJobHandler() {
        XxlJobHelper.log("xxljob的demoJobHandler开始了。。。。。。。。。。。。。。。。。");

        // 当前分片序号(从0开始)，执行器集群列表中当前执行器的序号；
        int shardIndex = XxlJobHelper.getShardIndex();
        // 总分片数，执行器集群的总机器数量；
        int shardTotal = XxlJobHelper.getShardTotal();
        XxlJobHelper.log("分片序号:" + shardIndex);
        XxlJobHelper.log("总分片数:" + shardTotal);

        XxlJobHelper.log("xxljob的demoJobHandler结束了。。。。。。。。。。。。。。。。。");


    }
}
